package pos.data;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import pos.domain.*;

public class JDBCIncidenciaDAO implements IIncidenciaDAO{
	
	Connection conn = ConnectionManager.getInstance().getConn();

	@Override
	public void insert(Incidencia incidencia) {
		String sql = "INSERT INTO incidencia (descripcion,idUsuario,idCalle,credibilidad) VALUES (?,?,?,?) ";
		PreparedStatement stmt = null;

		try {
			stmt = conn.prepareStatement(sql);
			stmt.setString(1, incidencia.getDescripcion());
			stmt.setInt(2, incidencia.getUsuario().getIdUsuario());
			stmt.setInt(3, incidencia.getCalle().getIdCalle());
			stmt.setInt(4, incidencia.getCredibilidad());
			stmt.executeUpdate();

		} catch (SQLException e) {
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			try {
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException e) {
			}
		}
		
	}

	@Override
	public List<Incidencia> selectByCalle(Calle calle) {
		PreparedStatement stmt = null;
		ResultSet result = null;
		List<Incidencia> lista = new ArrayList<Incidencia>();
		String sql = "SELECT * FROM incidencia WHERE idCalle = ?";
		Incidencia incidencia = null;
		JDBCUsuarioDAO usuarioDao = new JDBCUsuarioDAO();
		
		try {
			stmt = conn.prepareStatement(sql);
			stmt.setInt(1, calle.getIdCalle());
			result = stmt.executeQuery();

			while(result.next()){
				incidencia = new Incidencia();
				incidencia.setCalle(calle);
				incidencia.setDescripcion(result.getString("descripcion"));
				incidencia.setIdIncidencia(result.getInt("idIncidencia"));
				incidencia.setCredibilidad(result.getInt("credibilidad"));
				Usuario user = usuarioDao.selectById(result.getInt("idUsuario"));
				incidencia.setUsuario(user);
				lista.add(incidencia);
			}
		} catch (SQLException e) {
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			try {
				if (result != null) {
					result.close();
				}
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException e) {
			}
		}
		return lista;
	}

	@Override
	public List<Incidencia> selectAllIncidencias() {
		PreparedStatement stmt = null;
		ResultSet result = null;
		List<Incidencia> lista = new ArrayList<Incidencia>();
		String sql = "SELECT * FROM incidencia";
		Incidencia incidencia = null;
		JDBCCalleDAO calleDao = new JDBCCalleDAO();
		JDBCUsuarioDAO usuarioDao = new JDBCUsuarioDAO();
		
		Calle calle = null;
		try {
			stmt = conn.prepareStatement(sql);
			result = stmt.executeQuery();

			while(result.next()){
				incidencia = new Incidencia();
				calle = calleDao.selectByID(result.getInt("idCalle"));
				incidencia.setCalle(calle);
				incidencia.setDescripcion(result.getString("descripcion"));
				incidencia.setIdIncidencia(result.getInt("idIncidencia"));
				incidencia.setCredibilidad(result.getInt("credibilidad"));
				Usuario user = usuarioDao.selectById(result.getInt("idUsuario"));
				incidencia.setUsuario(user);
				lista.add(incidencia);
			}
		} catch (SQLException e) {
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			try {
				if (result != null) {
					result.close();
				}
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException e) {
			}
		}
		return lista;
	}

	@Override
	public void updateCredibilidad(int cred, Incidencia incidencia) {
		// TODO Auto-generated method stub
		PreparedStatement stmt = null;
		String sql ="update incidencia set credibilidad = credibilidad + ? where idIncidencia = ?";	

		try {
			stmt = conn.prepareStatement(sql);
			stmt.setInt(1, cred);
			stmt.setInt(2, incidencia.getIdIncidencia());
		
			stmt.executeUpdate();

		} catch (SQLException e) {
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			try {
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException e) {
			}
		}	
		
	}

	@Override
	public void delete(Incidencia incidencia) {
		// TODO Auto-generated method stub
		PreparedStatement stmt = null;
		String sql = "delete from incidencia where idIncidencia = ?";
		

		try {
			stmt = conn.prepareStatement(sql);
			stmt.setInt(1, incidencia.getIdIncidencia());
		
			stmt.executeUpdate();

		} catch (SQLException e) {
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			try {
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException e) {
			}
		}	
		
	}

	@Override
	public Incidencia selectById(int idIncidencia) {
		PreparedStatement stmt = null;
		ResultSet result = null;
		String sql = "SELECT * FROM incidencia WHERE idIncidencia = ?";
		Incidencia incidencia = null;
		JDBCUsuarioDAO usuarioDao = new JDBCUsuarioDAO();
		JDBCCalleDAO calleDao = new JDBCCalleDAO();
		
		try {
			stmt = conn.prepareStatement(sql);
			stmt.setInt(1, idIncidencia);
			result = stmt.executeQuery();

			if(result.next()){
				incidencia = new Incidencia();
				incidencia.setCalle(calleDao.selectByID(result.getInt("idCalle")));
				incidencia.setDescripcion(result.getString("descripcion"));
				incidencia.setIdIncidencia(result.getInt("idIncidencia"));
				incidencia.setCredibilidad(result.getInt("credibilidad"));
				Usuario user = usuarioDao.selectById(result.getInt("idUsuario"));
				incidencia.setUsuario(user);
			}
		} catch (SQLException e) {
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			try {
				if (result != null) {
					result.close();
				}
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException e) {
			}
		}
		return incidencia;
	}

}
